home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s_tool
/
picsave_.has
< prev
next >
Wrap
Text File
|
1997-10-17
|
20KB
|
898 lines
* PIC Save Routine
* written by GORRY.
* $Id: picsave.ap,v 2.0.0.5 1995/09/26 01:03:23 GORRY Exp GORRY $
.cpu 68000
dc.b '$Id: picsave.ap,v 2.0.0.5 1995/09/26 01:03:23 GORRY Exp GORRY $',0
.even
.include %APMacro.$$$ *@APSTART;
*@STRINGS;
.include iocscall.mac
.include doscall.mac
.include GORRY.mac
.include apicgsub.ap
icgsub.ap 1
.include picsave.h
* * * * * * * * * *
_PICSAVE::
* int PICSAVE(
* UWORD *SaveBuf,
* char *FileName,
* long SaveX1, long SaveY1, long SaveX2, long SaveY2,
* UBYTE *CommentBuf,
* UBYTE *FileBuf, long FileBufSize,
* ULONG Flag
* )
*
* SaveBuf 圧縮元バッファを差すポインタ。通常はGRAM_STARTを差している。常にワードアクセスされる。
* FileName セーブするファイル名を差すポインタ。
* SaveX1 圧縮開始Xドット位置。負で左端。画面をはみ出さないこと。
* SaveY1 圧縮開始Yドット位置。負で上端。画面をはみ出さないこと。
* SaveX2 圧縮終了Xドット位置。負で右端。画面をはみ出さないこと。
* SaveY2 圧縮終了Yドット位置。負で左端。画面をはみ出さないこと。
* CommentBuf コメント文字列の先頭を差すポインタ。$00で終わっていること。
* FileBuf ファイル書き込み用バッファを差すポインタ。常にワードアクセスされる。
* FileBufSize ファイル書き込み用バッファサイズ。128バイト以上必要。
* Flag 動作制御フラグ。
* bit0 1で拡張ヘッダをコメントに挿入しない。
* bit2 1でbit16以降の情報ビットを使用する。
* bit15 1でメモリイメージとしてセーブする。
* bit16 0で31KHz・1で15KHz(/XFL)
* bit17 0で非正方形・1で正方形(/XSS)
*
* return 0でセーブ成功、負でエラー。
clr.w -(sp)
BRA _PICSAVE_
_M_PICSAVE::
* int M_PICSAVE(
* UWORD *SaveBuf,
* long *SaveSize,
* long SaveX1, long SaveY1, long SaveX2, long SaveY2,
* UBYTE *CommentBuf,
* UBYTE *FileBuf, long FileBufSize,
* ULONG Flag
* )
*
* SaveBuf 圧縮元バッファを差すポインタ。通常はGRAM_STARTを差している。常にワードアクセスされる。
* SaveSize セーブメモリの使用バイト数を返すメモリへのポインタ。
* SaveX1 圧縮開始Xドット位置。負で左端。画面をはみ出さないこと。
* SaveY1 圧縮開始Yドット位置。負で上端。画面をはみ出さないこと。
* SaveX2 圧縮終了Xドット位置。負で右端。画面をはみ出さないこと。
* SaveY2 圧縮終了Yドット位置。負で左端。画面をはみ出さないこと。
* CommentBuf コメント文字列の先頭を差すポインタ。$00で終わっていること。
* FileBuf セーブメモリへのポインタ。常にワードアクセスされる。
* FileBufSize セーブメモリのサイズ。
* Flag 動作制御フラグ。
* bit0 1で拡張ヘッダをコメントに挿入しない。
* bit15 1でメモリイメージとしてセーブする。
*
* return 0でセーブ成功、負でエラー。
ST.b -(sp)
_PICSAVE_:
movem.l d1-d7/a0-a6,-(sp)
* パラメータ
lea 4*14+6(sp),a0
* ローカル変数領域を取得
link a5,#-LocalSize
lea -(LocalSize+LocalOffset)(a5),a5
* 大域脱出用
lea A5Back(pc),a1
move.l a5,(a1)
* スーパーバイザモードへ
clr.l -(sp)
DOS _SUPER
move.l d0,(sp)
* 本体をコール
bsr PicSave
* エラーコードを退避
move.l d0,d1
tst.l (sp)
AP_IFmac0000 *@ifpl {
DOS _SUPER
AP_ENDIFmac0000 *}
addq.w #4,sp
* エラーコード復帰
move.l d1,d0
lea (LocalSize+LocalOffset)(a5),a5
unlk a5
movem.l (sp)+,d1-d7/a0-a6
addq.w #2,sp
rts
* * * * * * * * * *
PicSave:
* in a0 Stack上のパラメータを差すポインタ
* out d0 エラーコード
* 大域脱出用
move.l sp,@@Stack(a5)
* パラメータを格納する
move.w -6(a0),d0
move.l (a0)+,@@SaveBufPtr(a5)
move.l (a0)+,@@FileNamePtr(a5)
move.l (a0)+,@@SaveX1(a5)
move.l (a0)+,@@SaveY1(a5)
move.l (a0)+,@@SaveX2(a5)
move.l (a0)+,@@SaveY2(a5)
move.l (a0)+,@@CommentBufPtr(a5)
move.l (a0)+,@@FileBufPtr(a5)
move.l (a0)+,@@FileBufSize(a5)
move.l (a0)+,@@Flag(a5)
tst.w d0
SNE.b @@UnSaved_Flag(a5)
bsr CheckScreen
bsr InitVar
* PICファイルを開く
tst.b @@UnSaved_Flag(a5)
AP_IFmac0100 *@ifcl {
move.w #$20,-(sp)
move.l @@FileNamePtr(a5),-(sp)
DOS _CREATE
addq.w #6,sp
CheckDOSErr
move.w d0,@@FileHandle(a5)
AP_ENDIFmac0100 *}
PicSave_:
* バッファ128バイト未満は却下
tst.b @@UnSaved_Flag(a5)
AP_IFmac0200 *@ifcl {
cmpi.l #128,@@FileBufSize(a5)
BCS Err_FileBufSize
AP_ENDIFmac0200 *}
* ファイルバッファ
move.l @@FileBufPtr(a5),BufPtrReg
* ファイルバッファ残りバイト数
move.l @@FileBufSize(a5),CountRestBufReg
* ビットバッファ残りビット数
moveq.l #16,BitCountReg
* ビットバッファ
moveq.l #0,BufTopReg
* PICヘッダを書き込む
move.w @@FileHandle(a5),-(sp)
pea PICHeader_mes(pc)
bsr PutStr
addq.w #6,sp
* コメント
bsr WriteComment
moveq.l #$1a,d0
* コメント終了
bsr PutChar
moveq.l #0,d0
bsr PutChar
moveq.l #0,d0
* Mode(予約)
bsr PutWord
* 色ビット数
moveq.l #15,d0
bsr PutWord
* Xドット数
move.w @@SizeX(a5),d0
bsr PutWord
* Yドット数
move.w @@SizeY(a5),d0
bsr PutWord
bsr InitColorTable
bsr SaveIt
ExitPicSave:
* A5が壊れている可能性があるので復帰
move.l A5Back(pc),a5
* CRTC R20
move.b @@CRTC_R20_Back(a5),($e80028)
* 大域脱出用
move.l @@Stack(a5),sp
move.l d0,-(sp)
tst.b @@UnSaved_Flag(a5)
AP_IFmac0300 *@ifst {
move.l @@FileBufSize(a5),d0
sub.l CountRestBufReg,d0
move.l @@FileNamePtr(a5),a0
move.l d0,(a0)
AP_ELSEmac0300 **} @else {
move.w @@FileHandle(a5),-(sp)
DOS _CLOSE
addq.w #2,sp
AP_ENDIFmac0300 *}
move.l (sp)+,d0
rts
A5Back: ds.l 1
* * * * * * * * * *
WriteComment:
* コメントを書き出す。
* 拡張ヘッダを付属する。
IPIC_WriteComment
* * * * * * * * * *
InitVar:
* 画面のアドレス計算などを行なう。領域チェックもする。
move.l d7,-(sp)
move.l @@Flag(a5),d7
* セーブする領域が画面内に収まっているかどうかを調べる
move.l @@SaveX2(a5),d1
AP_IFmac0400 *@ifmi {
* 位置指定がない
btst #15,d7
BNE Err_Rectangle
move.l #511,d1
move.l d1,@@SaveX2(a5)
AP_ENDIFmac0400 *}
move.l @@SaveX1(a5),d0
AP_IFmac0500 *@ifmi {
* 位置指定がない
btst #15,d7
BNE Err_Rectangle
moveq.l #0,d0
move.l d0,@@SaveX1(a5)
AP_ENDIFmac0500 *}
cmp.l d0,d1
* d0(X1) =< d1(X2)にする
AP_IFmac0600 *@ifcs {
exg.l d0,d1
move.l d0,@@SaveX1(a5)
move.l d1,@@SaveX2(a5)
AP_ENDIFmac0600 *}
AP_IFmac0700 *@if [ btst.l #15,d7 ].cl {
cmpi.w #512,d1
BHS Err_Rectangle
sub.l d0,d1
addq.l #1,d1
cmpi.w #512,d1
BHI Err_Rectangle
AP_ELSEmac0700 **} @else {
sub.l d0,d1
addq.l #1,d1
AP_ENDIFmac0700 *}
move.w d1,@@SizeX(a5)
move.l @@SaveY2(a5),d1
AP_IFmac0800 *@ifmi {
* 位置指定がない
btst #15,d7
BNE Err_Rectangle
move.l #511,d1
move.l d1,@@SaveY2(a5)
AP_ENDIFmac0800 *}
move.l @@SaveY1(a5),d0
AP_IFmac0900 *@ifmi {
* 位置指定がない
btst #15,d7
BNE Err_Rectangle
move.l #0,d0
move.l d0,@@SaveY1(a5)
AP_ENDIFmac0900 *}
cmp.l d0,d1
AP_IFmac0a00 *@ifcs {
* d0(Y1) =< d1(Y2)にする
exg.l d0,d1
move.l d0,@@SaveY1(a5)
move.l d1,@@SaveY2(a5)
AP_ENDIFmac0a00 *}
AP_IFmac0b00 *@if [ btst.l #15,d7 ].cl {
cmpi.w #512,d1
BHS Err_Rectangle
sub.l d0,d1
addq.l #1,d1
cmpi.w #512,d1
BHI Err_Rectangle
AP_ELSEmac0b00 **} @else {
sub.l d0,d1
addq.l #1,d1
AP_ENDIFmac0b00 *}
move.w d1,@@SizeY(a5)
* 1ラインのサイズを求める
move.w #512*2,@@LineSize(a5)
AP_IFmac0c00 *@if [ btst.l #15,d7 ].st {
move.w @@SizeX(a5),d0
addq.w #7,d0
andi.w #-8,d0
add.w d0,d0
cmp.w @@LineSize(a5),d0
AP_IFmac0d00 *@ifhi {
move.w d0,@@LineSize(a5)
AP_ENDIFmac0d00 *}
AP_ENDIFmac0c00 *}
* 圧縮開始アドレスを求める
move.l @@SaveY1(a5),d0
mulu @@LineSize(a5),d0
move.l @@SaveX1(a5),d1
ext.l d1
* +X*2
add.l d1,d1
add.l d1,d0
* +GRAM_START
add.l @@SaveBufPtr(a5),d0
move.l d0,@@CompressPtr(a5)
* 1ライン展開後、次のラインに移る時のオフセットを求める
move.w @@SizeX(a5),d0
add.w d0,d0
move.w @@LineSize(a5),d1
sub.w d0,d1
move.w d1,@@NextOffsetX(a5)
move.l (sp)+,d7
rts
* * * * * * * * * *
CheckScreen:
* 画面モードをチェックする。
* CRTC R20
move.b ($e80028),@@CRTC_R20_Back(a5)
* VCR1
cmpi.b #$03,($e82401)
BNE Err_ScreenMode
* CRTC R20
move.b #$03,($e80028)
rts
* * * * * * * * * *
InitColorTable:
* カラーテーブルを初期化する。
* カラーテーブルはC[0]-C[1]-C[2]-C[3]-...-C[127]-C[0]のポインタリンク形式。
IPIC_InitColorTable
* * * * * * * * * *
SaveIt:
* 圧縮メインルーチン
move.l @@CompressPtr(a5),CompressPtrReg
bsr SetDiffFlag
* * * * *
moveq.l #0,ColorReg
move.w (CompressPtrReg),ColorReg
not.w ColorReg
moveq.l #-1,LenReg
* Y方向のカウンタ
move.w @@SizeY(a5),d0
subq.w #1,d0
AP_SREPEATmac0000 *@repeat [ d0 ].w {
* 1画面圧縮
move.w d0,-(sp)
moveq.l #0,WidthXReg
move.w @@SizeX(a5),WidthXReg
subq.w #1,WidthXReg
* * * * *
* 横連続を圧縮する
Compress1Line:
* 1ライン圧縮
AP_SBLOCK0000: *{
addq.l #1,LenReg
move.w (CompressPtrReg)+,ColorReg
bclr #0,ColorReg
DBNE WidthXReg,AP_SBLOCK0000 *dbst WidthXReg,<
AP_EBLOCK0000: *}
AP_IFmac0e00 *@ifst {
bsr SaveLength
* * * * *
* 色情報を書き出す 0xxxxxxx_xxxxxxxx 色コード(生情報)
* 1xxxxxxx テーブル参照
* テーブルから色を探す
lea -SColorTableSize(a5),a0
moveq.l #128-1,d0
AP_SBLOCK0100: *{
addq.w #SColorTableSize,a0
.ifdef SLOWER
cmp.w SColorTable_Col(a0),ColorReg
.else
cmp.w (a0),ColorReg
.endif
DBEQ d0,AP_SBLOCK0100 *dbeq d0,<
AP_EBLOCK0100: *}
AP_IFmac0f00 *@ifeq {
* テーブルにある
eori.w #127,d0
moveq.l #0,d1
move.b d0,d1
ori.b #$80,d1
WriteBits #8,d1
* テーブルから色を取り出し、再登録
* テーブルオフセットにしておく
.ifdef SLOWER
mulu #SColorTableSize,d0
.else
lsl.w #3,d0
.endif
* 高速化のため。無理に使う必要はない。
lea (a5,d0.w),a0
cmp.w @@ColorTable_TopPtr(a5),d0
* 最新色として登録
AP_IFmac1000 *@ifne {
* C[x-1]-C[x]-C[x+1] -> C[x-1]-C[x+1]
move.w SColorTable_Next(a0),d1
move.w SColorTable_Prev(a0),d2
move.w d1,SColorTable_Next(a5,d2.w)
move.w d2,SColorTable_Prev(a5,d1.w)
* C[127]-C[0] -> C[127]-C[new]-C[0]
move.w @@ColorTable_TopPtr(a5),d1
move.w SColorTable_Prev(a5,d1.w),d2
move.w d1,SColorTable_Next(a0)
move.w d2,SColorTable_Prev(a0)
move.w d0,SColorTable_Next(a5,d2.w)
move.w d0,SColorTable_Prev(a5,d1.w)
move.w d0,@@ColorTable_TopPtr(a5)
AP_ENDIFmac1000 *}
.ifdef SLOWER
move.w SColorTable_Col(a0),ColorReg
.else
move.w (a0),ColorReg
.endif
AP_ELSEmac0f00 **} @else {
* 生情報
* 色を読み込んでテーブルに登録
moveq.l #0,d0
move.w ColorReg,d0
lsr.w #1,d0
WriteBits #16,d0
* リンクポインタの先頭からひとつ前へ戻って、
move.w @@ColorTable_TopPtr(a5),d0
move.w SColorTable_Prev(a5,d0.w),d0
* そこを新しい先頭にする。
move.w d0,@@ColorTable_TopPtr(a5)
move.w ColorReg,SColorTable_Col(a5,d0.w)
AP_ENDIFmac0f00 *}
* * * * *
* 連鎖圧縮の準備
SaveChain:
* YWidth
move.w (sp),d0
move.w WidthXReg,-(sp)
* 連鎖圧縮時のポインタにする。+2になっているが、高速化のため。
move.l CompressPtrReg,ChainPtrReg
* +2されているので-2しておく
move.w ColorReg,-(ChainPtrReg)
AP_SBLOCK0200: *{
DBRA d0,AP_EBLOCK0200 *dbra d0,>
* これ以上下へ行けない
BRA SaveChain_e
AP_EBLOCK0200: *}
move.w ColorReg,d1
* 輝度ビットを立てておく
addq.w #1,d1
* 左端を差す
move.w @@SizeX(a5),a0
* * * * *
* 連鎖圧縮する start---+---0(連鎖なし)
* |
* +-→+---1---+---00------+---0(連鎖終了)
* | 連鎖あり |その他 |
* | +---01--+ +---1---+---0---+
* | |下1左1 | |下1左2 |
* ↑ +---10--+ +---1---+
* | |下1 | 下1右2 |
* | +---11--+ |
* | 下1右1 | |
* +---------←--------+---------←--------+
*
* ビットパターンと連鎖位置 O
* |
* +---+---+---+---+
* 0 0 1 1 0
* 0 1 0 1 0
* 1 1
* 0 1
PosXReg reg WidthXReg * 使わせてもらいます
* 1つめの連鎖を見つける
SaveChain_1:
* 1ライン下がる
add.w @@LineSize(a5),ChainPtrReg
SaveChain_1_C:
cmp.w (ChainPtrReg),d1
AP_IFmac1100 *@ifeq {
* 連鎖発見
SetBit
BRA SaveChain_2_C_
AP_ENDIFmac1100 *}
SaveChain_1_L1:
subq.w #2,ChainPtrReg
addq.w #2/2,PosXReg
* 左端チェック
cmp.w a0,PosXReg
AP_IFmac1200 *@iflt {
cmp.w (ChainPtrReg),d1
AP_IFmac1300 *@ifeq {
* 連鎖発見
SetBit
BRA SaveChain_2_L1_
AP_ENDIFmac1300 *}
AP_ENDIFmac1200 *}
SaveChain_1_R1:
addq.w #4,ChainPtrReg
subq.w #4/2,PosXReg
* 右端チェック
AP_IFmac1400 *@ifcc {
cmp.w (ChainPtrReg),d1
AP_IFmac1500 *@ifeq {
* 連鎖発見
SetBit
BRA SaveChain_2_R1_
AP_ENDIFmac1500 *}
AP_ENDIFmac1400 *}
SaveChain_1_L2:
subq.w #6,ChainPtrReg
addq.w #6/2,PosXReg
* 左端チェック
cmp.w a0,PosXReg
AP_IFmac1600 *@iflt {
cmp.w (ChainPtrReg),d1
AP_IFmac1700 *@ifeq {
* 連鎖発見
SetBit
BRA SaveChain_2_L2_
AP_ENDIFmac1700 *}
AP_ENDIFmac1600 *}
SaveChain_1_R2:
addq.w #8,ChainPtrReg
subq.w #8/2,PosXReg
* 右端チェック
AP_IFmac1800 *@ifcc {
cmp.w (ChainPtrReg),d1
AP_IFmac1900 *@ifeq {
* 連鎖発見
SetBit
BRA SaveChain_2_R2_
AP_ENDIFmac1900 *}
AP_ENDIFmac1800 *}
SaveChain_1_e:
* 連鎖はなかった
BRA SaveChain_e
* * *
* 2つめ以降の連鎖を見つける
SaveChain_2:
TempReg reg LenReg * 空きレジスタの有効活用
* 連鎖フラグを下ろす
move.w ColorReg,(ChainPtrReg)
AP_SBLOCK0300: *{
DBRA d0,AP_EBLOCK0300 *dbra d0,>
* これ以上下へ行けない
BRA SaveChain_2_e
AP_EBLOCK0300: *}
* 1ライン下がる
add.w @@LineSize(a5),ChainPtrReg
SaveChain_2_C:
cmp.w (ChainPtrReg),d1
AP_IFmac1a00 *@ifeq {
SaveChain_2_C_:
* 連鎖発見
moveq.l #2,TempReg
WriteBits #2,TempReg
BRA SaveChain_2
AP_ENDIFmac1a00 *}
SaveChain_2_L1:
subq.w #2,ChainPtrReg
addq.w #2/2,PosXReg
* 左端チェック
cmp.w a0,PosXReg
AP_IFmac1b00 *@iflt {
cmp.w (ChainPtrReg),d1
AP_IFmac1c00 *@ifeq {
SaveChain_2_L1_:
* 連鎖発見
moveq.l #1,TempReg
WriteBits #2,TempReg
BRA SaveChain_2
AP_ENDIFmac1c00 *}
AP_ENDIFmac1b00 *}
SaveChain_2_R1:
addq.w #4,ChainPtrReg
subq.w #4/2,PosXReg
* 右端チェック
AP_IFmac1d00 *@ifcc {
cmp.w (ChainPtrReg),d1
AP_IFmac1e00 *@ifeq {
SaveChain_2_R1_:
* 連鎖発見
moveq.l #3,TempReg
WriteBits #2,TempReg
BRA SaveChain_2
AP_ENDIFmac1e00 *}
AP_ENDIFmac1d00 *}
SaveChain_2_L2:
subq.w #6,ChainPtrReg
addq.w #6/2,PosXReg
* 左端チェック
cmp.w a0,PosXReg
AP_IFmac1f00 *@iflt {
cmp.w (ChainPtrReg),d1
AP_IFmac2000 *@ifeq {
SaveChain_2_L2_:
* 連鎖発見
moveq.l #2,TempReg
WriteBits #4,TempReg
BRA SaveChain_2
AP_ENDIFmac2000 *}
AP_ENDIFmac1f00 *}
SaveChain_2_R2:
addq.w #8,ChainPtrReg
subq.w #8/2,PosXReg
* 右端チェック
AP_IFmac2100 *@ifcc {
cmp.w (ChainPtrReg),d1
AP_IFmac2200 *@ifeq {
SaveChain_2_R2_:
* 連鎖発見
moveq.l #3,TempReg
WriteBits #4,TempReg
BRA SaveChain_2
AP_ENDIFmac2200 *}
AP_ENDIFmac2100 *}
SaveChain_2_e:
* 連鎖はもうない
moveq.l #0,TempReg
WriteBits #2,TempReg
SaveChain_e:
* 連鎖終了
ClrBit
move.w (sp)+,WidthXReg
PosXReg reg X *ほんとはundefしたい・・・ * Thanks for WidthXReg!
TempReg reg X *ほんとはundefしたい・・・ * Thanks for LenReg!
* * * * *
* 次の横連続圧縮に入る
moveq.l #-1,LenReg
DBRA WidthXReg,Compress1Line
AP_ENDIFmac0e00 *}
* * * * *
* 1ライン終了
add.w @@NextOffsetX(a5),CompressPtrReg
* * * * *
* 1画面終了判定
move.w (sp)+,d0
AP_EREPEATmac0000 *} * @endrepeat;
addq.l #1,LenReg
bsr SaveLength
* * * * *
* 終了
bsr FlushBuf
moveq.l #0,d0
rts
* * * * * * * * * *
* 横方向へデータを比較し、色が変わるところにフラグを立てておく
SetDiffFlag:
move.l CompressPtrReg,-(sp)
.ifdef SLOWER
* 輝度ビットマスク用データ
moveq.l #$ffff_fffe,d3
move.w (CompressPtrReg),ColorReg
* 輝度ビットマスク
and.w d3,ColorReg
not.w ColorReg
move.w @@SizeY(a5),d0
subq.w #1,d0
AP_SREPEATmac0100 *@repeat [ d0 ].w {
move.w d0,-(sp)
move.w @@SizeX(a5),WidthXReg
subq.w #1,WidthXReg
AP_SREPEATmac0200 *@repeat [ WidthXReg ].w {
move.w (CompressPtrReg),d0
* 輝度ビットマスク
and.w d3,d0
cmp.w ColorReg,d0
* フラグを立てる
AP_IFmac2300 *@ifne {
move.w d0,ColorReg
* 輝度ビットを立てる
addq.w #1,d0
AP_ENDIFmac2300 *}
move.w d0,(CompressPtrReg)+
AP_EREPEATmac0200 *} * @endrepeat;
adda.w @@NextOffsetX(a5),CompressPtrReg
move.w (sp)+,d0
AP_EREPEATmac0100 *} * @endrepeat;
.else
moveq.l #$ffff_fffe,d3
move.w (CompressPtrReg),ColorReg
* 輝度ビットマスク
and.w d3,ColorReg
not.w ColorReg
move.w @@SizeY(a5),d1
subq.w #1,d1
AP_SREPEATmac0300 *@repeat [ d1 ].w {
move.w @@SizeX(a5),WidthXReg
lsr.w #1,WidthXReg
AP_IFmac2400 *@ifcs {
move.w (CompressPtrReg),d0
* 輝度ビットマスク
and.w d3,d0
cmp.w ColorReg,d0
* フラグを立てる
AP_IFmac2500 *@ifne {
move.w d0,ColorReg
* 輝度ビットを立てる
addq.w #1,d0
AP_ENDIFmac2500 *}
move.w d0,(CompressPtrReg)+
AP_ENDIFmac2400 *}
AP_SBLOCK0400: *{
DBRA WidthXReg,AP_EBLOCK0400 *dbra WidthXReg,>
BRA SetDiffFlag_1
AP_EBLOCK0400: *}
AP_SREPEATmac0400 *@repeat [ WidthXReg ].w {
move.w (CompressPtrReg),d0
* 輝度ビットマスク
and.w d3,d0
cmp.w ColorReg,d0
* フラグを立てる
AP_IFmac2600 *@ifne {
move.w d0,ColorReg
* 輝度ビットを立てる
addq.w #1,d0
AP_ENDIFmac2600 *}
move.w d0,(CompressPtrReg)+
move.w (CompressPtrReg),d0
* 輝度ビットマスク
and.w d3,d0
cmp.w ColorReg,d0
* フラグを立てる
AP_IFmac2700 *@ifne {
move.w d0,ColorReg
* 輝度ビットを立てる
addq.w #1,d0
AP_ENDIFmac2700 *}
move.w d0,(CompressPtrReg)+
AP_EREPEATmac0400 *} * @endrepeat;
SetDiffFlag_1:
adda.w @@NextOffsetX(a5),CompressPtrReg
AP_EREPEATmac0300 *} * @endrepeat;
.endif
move.l (sp)+,CompressPtrReg
rts
* * * * * * * * * *
IPIC_SaveSub
* * * * * * * * * *
* エラー処理
Err_FileBufSize: * ファイルバッファサイズが異常
* UserErr02
moveq.l #-124+2,d0
BRA ExitPicSave
Err_Rectangle: * 座標が画面外
* UserErr03
moveq.l #-124+3,d0
BRA ExitPicSave
Err_ScreenMode: * 画面モードが正しくない
* UserErr06
moveq.l #-114+6,d0
BRA ExitPicSave
Err_WriteBuf: * ディスクがいっぱい
moveq.l #-23,d0
BRA ExitPicSave
* * * * * * * * * *
PICHeader_mes:
dc.b 'PIC',0
.even
.include %APStrMacro.$$$ *@STRSEC;
.even
* * * * * * * * * *
* * * * * * * * *
* このファイルはパブリック・ドメインとなっています。 *
* 改造・再配布・使用について必要な条件はありません。 *
* また、このファイルの使用による責務を作者である *
* GORRYは負わないこととします。 *
* * * * * * * * *